package cn.iocoder.lw.module.member.listener;

import cn.iocoder.lw.framework.common.util.object.BeanUtils;
import cn.iocoder.lw.framework.common.event.AdminUserCreateEvent;
import cn.iocoder.lw.framework.common.enums.SystemUserTypeEnum;
import cn.iocoder.lw.module.member.api.user.MemberUserApi;
import cn.iocoder.lw.module.member.api.user.dto.AdminUserSyncDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import jakarta.annotation.Resource;

/**
 * 管理员用户创建事件监听器
 * 监听System模块发布的用户创建事件，同步创建Member用户
 */
@Component
@Slf4j
public class AdminUserCreateEventListener {

    @Resource
    private MemberUserApi memberUserApi;

    /**
     * 监听管理员用户创建事件
     *
     * @param event 管理员用户创建事件
     */
    @EventListener
    @Async  // 异步处理，避免阻塞主业务流程
    public void onAdminUserCreate(AdminUserCreateEvent event) {
        try {
            log.info("接收到管理员用户创建事件，开始处理member用户同步，systemUserId: {}",
                    event.getUserId());

            // 只处理服务商类型用户的同步
            if (!SystemUserTypeEnum.SERVICE_PROVIDER.getType().equals(event.getUserType())) {
                log.info("用户类型不是服务商，跳过member用户同步，systemUserId: {}, userType: {}",
                        event.getUserId(), event.getUserType());
                return;
            }

            // 转换为同步DTO
            AdminUserSyncDTO adminUserSyncDTO = new AdminUserSyncDTO();
            adminUserSyncDTO.setId(event.getUserId());
            adminUserSyncDTO.setUsername(event.getUsername());
            adminUserSyncDTO.setNickname(event.getNickname());
            adminUserSyncDTO.setMobile(event.getMobile());
            adminUserSyncDTO.setEmail(event.getEmail());
            adminUserSyncDTO.setStatus(event.getStatus());
            adminUserSyncDTO.setUserType(event.getUserType());
            adminUserSyncDTO.setCreateTime(event.getCreateTime());

            // 调用member模块API创建或获取用户
            Long memberUserId = memberUserApi.createUserFromSystem(adminUserSyncDTO);

            if (memberUserId != null) {
                log.info("成功同步系统用户到member模块，systemUserId: {}, memberUserId: {}",
                        event.getUserId(), memberUserId);
            } else {
                log.warn("同步系统用户到member模块失败，返回memberUserId为空，systemUserId: {}",
                        event.getUserId());
            }

        } catch (Exception e) {
            log.error("处理管理员用户创建事件异常，systemUserId: {}",
                    event.getUserId(), e);
            // 同步失败不影响主业务流程，只记录错误日志
        }
    }

}